1、题干
给你一个下标从 0 开始的整数数组 nums
和一个整数 value
。
在一步操作中,你可以对 nums
中的任一元素加上或减去 value
。
- 例如,如果
nums = [1,2,3]
且value = 2
,你可以选择nums[0]
减去value
,得到nums = [-1,2,3]
。
数组的 MEX (minimum excluded) 是指其中数组中缺失的最小非负整数。
- 例如,
[-1,2,3]
的 MEX 是0
,而[1,0,3]
的 MEX 是2
。
返回在执行上述操作 任意次 后,nums
的最大 MEX 。
示例 1:
输入:nums = [1,-10,7,13,6,8], value = 5
输出:4
解释:执行下述操作可以得到这一结果:
- nums[1] 加上 value 两次,nums = [1,0,7,13,6,8]
- nums[2] 减去 value 一次,nums = [1,0,2,13,6,8]
- nums[3] 减去 value 两次,nums = [1,0,2,3,6,8]
nums 的 MEX 是 4 。可以证明 4 是可以取到的最大 MEX 。
示例 2:
输入:nums = [1,-10,7,13,6,8], value = 7
输出:2
解释:执行下述操作可以得到这一结果:
- nums[2] 减去 value 一次,nums = [1,-10,0,13,6,8]
nums 的 MEX 是 2 。可以证明 2 是可以取到的最大 MEX 。
提示:
1 <= nums.length, value <= 105
-109 <= nums[i] <= 109
2、思路
- 对
nums
所有元素与value
取模计数,得到数组ms
- 遍历区间
[0,nums.length)
,消费ms
,直到遍历结束 或ms
中某个余数被消耗完(ms[i % value] < 1
) ,此时的下标i
即所求结果
3、代码
function findSmallestInteger(nums: number[], value: number): number {
const ms = new Array(value).fill(0);
for (const n of nums) {
const mod = n % value + (n % value < 0 ? value : 0);
ms[mod]++;
}
let ans = 0;
for (let i = 0; i < nums.length; i++, ans++) {
const mod = i % value;
if (ms[mod] < 1) break;
ms[mod]--;
}
return ans;
};
4、复杂度
- 时间复杂度:
- 空间复杂度: